/**
 * 
 */
package com.proyecto.afiliacion.modelo.servicios;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.exception.ConstraintViolationException;

import com.proyecto.afiliacion.modelo.dto.Afiliados;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.personas.modelo.dto.CorrelativosPersId;
import com.proyecto.personas.modelo.servicio.ServicioCorrelativosPersonas;

/**
 * @author vico
 *
 */
public class ServicioAfiliados extends ServicioGenerico {

	/**
	 * 
	 */
	ServicioCorrelativosPersonas 	servicioCorrelativosPersona;
	
	public ServicioAfiliados() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		// TODO Auto-generated method stub
		
		Afiliados objAfiliados = (Afiliados) pojo;
		

		if (isValidacionActiva()){
			validacion.incluir(objAfiliados);
		}
		
		try {
			Long proxNumero = servicioCorrelativosPersona.obtenerProximoNumeroComoEntero(
					new CorrelativosPersId(objAfiliados.getId().getCiaopr(),"AFILIADOS","afiliadocod"),true);
					
			objAfiliados.getId().setAfiliadocod(proxNumero.intValue());
			
			super.incluir(objAfiliados, true);
				
				
		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.PropertyValueException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.datoRequeridoVacio");
			} else if (e.getMostSpecificCause() instanceof ConstraintViolationException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.registroDuplicado");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");

		} catch (org.springframework.dao.DataAccessResourceFailureException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.exception.JDBCConnectionException) {
				throw new GeneralException(
						"error." + claveProperties + ".conexion");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");
		} catch (Exception e) {
			System.err.println(":::ServicioAfiliados::: " + e.getMessage());
			if("advertencia.contratos.tablaApoyo.Contratistas.modificar.BloqueoOptimista".equals(e.getMessage())){
				throw new GeneralException(	e.getMessage());
			}else{
				throw new GeneralException(
						"error." + claveProperties + ".desconocido");
			}
			
		}
		
	}
	
	public List<Afiliados> buscarObjAfiliados(Integer nropersona){
		//Afiliados objAfiliados = null;
		List<Afiliados> listAfiliados = null;
		//String[] atributo = null;
		//Object[] valor = null;
		String query = "FROM Afiliados afil " +
						" WHERE afil.nropersona = " + nropersona +
						" AND afilstatuscod = 'ACT'" ;
		
		
		try {
			listAfiliados = propiedadDAO.ejecutarQueryConsulta(query, null);	
		} catch (Exception e) {
			// TODO: handle exception
			listAfiliados = new ArrayList<Afiliados>();
		}
		 
		return listAfiliados;
		
	}
	
	public List<Afiliados> listaAfiliacionFiltrarCon_AfilsCnts(Integer nropersona){
		//Afiliados objAfiliados = null;
		List<Afiliados> listAfiliados = null;
		//String[] atributo = null;
		//Object[] valor = null;
		String query = "SELECT A " +
						"FROM Afiliados A" +
						" WHERE A.nropersona = " + nropersona +
						" AND A.afilstatuscod = 'ACT' " +
						" AND A.id.afiliadocod NOT IN (SELECT A.id.afiliadocod "+
													" FROM AfilsCnts A " +
													" WHERE A.id.nropersona = " + nropersona + ")";

		
		System.out.println("query:: " + query);
		try {
			listAfiliados = propiedadDAO.ejecutarQueryConsulta(query, null);	
		} catch (Exception e) {
			// TODO: handle exception
			listAfiliados = new ArrayList<Afiliados>();
		}
		 
		return listAfiliados;
		
	}


	public List<Afiliados> listaAfiliacion(Integer nropersona){
		//Afiliados objAfiliados = null;
		List<Afiliados> listAfiliados = null;
		//String[] atributo = null;
		//Object[] valor = null;
		String query = "SELECT A " +
						"FROM Afiliados A" +
						" WHERE A.nropersona = " + nropersona +
						" AND A.afilstatuscod = 'ACT' ";

		
		System.out.println("query:: " + query);
		try {
			listAfiliados = propiedadDAO.ejecutarQueryConsulta(query, null);	
		} catch (Exception e) {
			// TODO: handle exception
			listAfiliados = new ArrayList<Afiliados>();
		}
		 
		return listAfiliados;
		
	}

	public ServicioCorrelativosPersonas getServicioCorrelativosPersona() {
		return servicioCorrelativosPersona;
	}
	public void setServicioCorrelativosPersona(
			ServicioCorrelativosPersonas servicioCorrelativosPersona) {
		this.servicioCorrelativosPersona = servicioCorrelativosPersona;
	}

}
